package pub.tbc.api;

import com.google.common.collect.Lists;
import io.netty.channel.ChannelHandler;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpRequestDecoder;
import io.netty.handler.codec.http.HttpResponseEncoder;
import lombok.extern.slf4j.Slf4j;
import pub.tbc.api.config.ProjectConfig;
import pub.tbc.api.handler.HeartbeatHandler;
import pub.tbc.api.handler.InvokerHandler;
import pub.tbc.api.handler.NoServiceAddressFilter;
import pub.tbc.api.helper.ClassHelper;
import pub.tbc.toolkit.classes.ClassUtil;

import java.util.List;

/**
 * 根据配置信息实例化ChannelHandler对象
 *
 * @author tbc on 2017/3/24 14:27:42.
 */
@Slf4j
public class HandlerFactory {
    private static ProjectConfig projectConfig = ProjectConfig.instance();

    public static List<String> configHandlers() {
        return projectConfig.handlers();
    }

    /**
     * 处理链：
     * 1. 先从配置读，若有相关配置，则使用配置生成处理器列表；
     * 2. 若无配置，读取全部处理器，排除使用注解标不使用的；
     */
    public static List<ChannelHandler> handlers() {
        List<ChannelHandler> list = Lists.newArrayList(
                new HttpRequestDecoder(),
                new HttpObjectAggregator(65535),
                new HttpResponseEncoder()
        );
        list.addAll(ClassHelper.genericityInstance(ClassHelper.loadClass(configHandlers())));
        return list;
    }


    /**
     * 处理链：
     * 1. 先从配置读，若有相关配置，则使用配置生成处理器列表；
     * 2. 若无配置，读取全部处理器，排除使用注解标不使用的；
     */
    public static List<ChannelHandler> handlers0() {
        return Lists.newArrayList(
                new HttpRequestDecoder(),
                new HttpObjectAggregator(65535),
                new HttpResponseEncoder(),
//                new ChunkedWriteHandler(),
//                new HttpFilter(),
                new HeartbeatHandler(),
                new NoServiceAddressFilter(),
                new InvokerHandler()
        );
    }
}
